Previous: Type Predicates, Up: Lisp Data Types [Contents][Index]
Here we describe functions that test for equality between two objects. Other functions test equality of contents between objects of specific types, e.g., strings. For these predicates, see the appropriate chapter describing the data type.
This function returns t if object1
and object2 are the same object, and
nil otherwise.
If object1 and object2 are integers
with the same value, they are considered to be the same
object (i.e., eq returns t). If
object1 and object2 are symbols with
the same name, they are normally the same object—but
see Creating
Symbols for exceptions. For other types (e.g., lists,
vectors, strings), two arguments with the same contents or
elements are not necessarily eq to each other:
they are eq only if they are the same object,
meaning that a change in the contents of one will be
reflected by the same change in the contents of the
other.
(eq 'foo 'foo)
⇒ t
(eq 456 456)
⇒ t
(eq "asdf" "asdf")
⇒ nil
(eq "" "")
⇒ t
;; This exception occurs because Emacs Lisp
;; makes just one multibyte empty string, to save space.
(eq '(1 (2 (3))) '(1 (2 (3))))
⇒ nil
(setq foo '(1 (2 (3))))
⇒ (1 (2 (3)))
(eq foo foo)
⇒ t
(eq foo '(1 (2 (3))))
⇒ nil
(eq [(1 2) 3] [(1 2) 3])
⇒ nil
(eq (point-marker) (point-marker))
⇒ nil
The make-symbol function returns an
uninterned symbol, distinct from the symbol that is used if
you write the name in a Lisp expression. Distinct symbols
with the same name are not eq. See Creating
Symbols.
(eq (make-symbol "foo") 'foo)
⇒ nil
This function returns t if object1
and object2 have equal components, and
nil otherwise. Whereas eq tests if
its arguments are the same object, equal looks
inside nonidentical arguments to see if their elements or
contents are the same. So, if two objects are
eq, they are equal, but the
converse is not always true.
(equal 'foo 'foo)
⇒ t
(equal 456 456)
⇒ t
(equal "asdf" "asdf")
⇒ t
(eq "asdf" "asdf")
⇒ nil
(equal '(1 (2 (3))) '(1 (2 (3))))
⇒ t
(eq '(1 (2 (3))) '(1 (2 (3))))
⇒ nil
(equal [(1 2) 3] [(1 2) 3])
⇒ t
(eq [(1 2) 3] [(1 2) 3])
⇒ nil
(equal (point-marker) (point-marker))
⇒ t
(eq (point-marker) (point-marker))
⇒ nil
Comparison of strings is case-sensitive, but does not take
account of text properties—it compares only the
characters in the strings. See Text Properties.
Use equal-including-properties to also compare
text properties. For technical reasons, a unibyte string and
a multibyte string are equal if and only if they
contain the same sequence of character codes and all these
codes are either in the range 0 through 127
(ASCII) or 160 through 255
(eight-bit-graphic). (see Text
Representations).
(equal "asdf" "ASDF")
⇒ nil
However, two distinct buffers are never considered
equal, even if their textual contents are the
same.
The test for equality is implemented recursively; for example,
given two cons cells x and y, (equal
x y) returns t if and
only if both the expressions below return t:
(equal (car x) (car y)) (equal (cdr x) (cdr y))
Because of this recursive method, circular lists may therefore cause infinite recursion (leading to an error).
This function behaves like equal in all cases
but also requires that for two strings to be equal, they have
the same text properties.
(equal "asdf" (propertize "asdf" 'asdf t))
⇒ t
(equal-including-properties "asdf"
(propertize "asdf" 'asdf t))
⇒ nil
Previous: Type Predicates, Up: Lisp Data Types [Contents][Index]